/*

 * Licensed to the Apache Software Foundation (ASF) under one

 * or more contributor license agreements.  See the NOTICE file

 * distributed with this work for additional information

 * regarding copyright ownership.  The ASF licenses this file

 * to you under the Apache License, Version 2.0 (the

 * "License"); you may not use this file except in compliance

 * with the License.  You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */

package com.bff.gaia.unified.runners.core.metrics;



import com.bff.gaia.unified.vendor.grpc.v1p13p1.com.google.common.collect.Iterables;

import com.bff.gaia.unified.sdk.metrics.DistributionResult;

import com.bff.gaia.unified.sdk.metrics.GaugeResult;

import com.bff.gaia.unified.sdk.metrics.MetricFiltering;

import com.bff.gaia.unified.sdk.metrics.MetricQueryResults;

import com.bff.gaia.unified.sdk.metrics.MetricResult;

import com.bff.gaia.unified.sdk.metrics.MetricResults;

import com.bff.gaia.unified.sdk.metrics.MetricsFilter;



import javax.annotation.Nullable;



/**

 * Default implementation of {@link MetricResults}, which takes static

 * {@link Iterable}s of counters, distributions, and gauges, and serves queries by applying {@link

 * MetricsFilter}s linearly to them.

 */

public class DefaultMetricResults extends MetricResults {



  private final Iterable<MetricResult<Long>> counters;

  private final Iterable<MetricResult<DistributionResult>> distributions;

  private final Iterable<MetricResult<GaugeResult>> gauges;



  public DefaultMetricResults(

      Iterable<MetricResult<Long>> counters,

      Iterable<MetricResult<DistributionResult>> distributions,

      Iterable<MetricResult<GaugeResult>> gauges) {

    this.counters = counters;

    this.distributions = distributions;

    this.gauges = gauges;

  }



  @Override

  public MetricQueryResults queryMetrics(@Nullable MetricsFilter filter) {

    return MetricQueryResults.create(

        Iterables.filter(counters, counter -> MetricFiltering.matches(filter, counter.getKey())),

        Iterables.filter(

            distributions, distribution -> MetricFiltering.matches(filter, distribution.getKey())),

        Iterables.filter(gauges, gauge -> MetricFiltering.matches(filter, gauge.getKey())));

  }

}